/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.daoImpl;

import com.evangelion.core.bean.Declaracion;
import com.evangelion.core.bean.Movimiento;
import com.evangelion.core.bean.MovimientoAux;
import com.evangelion.core.bean.Seccione;
import com.evangelion.core.dao.MovimientoDao;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Query;

/**
 *
 * @author Kellycasma
 */
public class MovimientoDaoImpl extends GenericDaoImpl<Serializable> implements MovimientoDao {

    @Override
    public List<Movimiento> searchByApunte(Seccione seccion, String valorParametro, Date fechaI, Date fechaF) {
        em = getEntityManager();
        Query q;
        System.out.println("fechaIni" + fechaI);
        System.out.println("fechaF:" + fechaF);
        if (seccion == null) {
            q = em.createQuery("SELECT m FROM Movimiento m WHERE m.id LIKE :valorParametro AND m.fecha>= :fechaI AND  m.fecha<=:fechaF");
        } else {
            q = em.createQuery("SELECT m FROM Movimiento m WHERE m.id LIKE :valorParametro AND m.fecha>= :fechaI AND  m.fecha<=:fechaF AND m.seccion=:seccion");
            q.setParameter("seccion", seccion);
        }
        q.setParameter("valorParametro", "%" + valorParametro + "%");
        q.setParameter("fechaI", fechaI);
        q.setParameter("fechaF", fechaF);

        return q.getResultList();
    }

    @Override
    public List<Movimiento> searchByFactura(Seccione seccion, Date fechaIn, Date fechaFn) {
        em = getEntityManager();
        System.out.println("fechaIni" + fechaIn);
        System.out.println("fechaF:" + fechaFn);
        Query q = em.createQuery("SELECT  m FROM Movimiento m WHERE m.fecha>= :fechaIn AND m.fecha<=:fechaFn AND m.excluir <> 1 AND m.seccion=:seccion");

        q.setParameter("fechaIn", fechaIn);
        q.setParameter("fechaFn", fechaFn);
        q.setParameter("seccion", seccion);
        return q.getResultList();
    }

    public Double searchByTotal(Seccione seccion, Date fechaIn, Date fechaFn) {
        em = getEntityManager();
        Query q = em.createQuery("SELECT SUM(m.haber) FROM Movimiento m WHERE m.fecha>= :fechaIn AND m.fecha<=:fechaFn AND m.excluir <> 1 AND m.seccion=:seccion");

        q.setParameter("fechaIn", fechaIn);
        q.setParameter("fechaFn", fechaFn);
        q.setParameter("seccion", seccion);
        return (Double) q.getSingleResult();
    }

    public Double searchByImpIva(Seccione seccion, Date fechaIn, Date fechaFn) {
        em = getEntityManager();
        Query q = em.createQuery("SELECT SUM(m.impIVA) FROM Movimiento m WHERE m.fecha>= :fechaIn AND m.fecha<=:fechaFn AND m.excluir <> 1 AND m.seccion=:seccion");

        q.setParameter("fechaIn", fechaIn);
        q.setParameter("fechaFn", fechaFn);
        q.setParameter("seccion", seccion);
        return (Double) q.getSingleResult();
    }

    @Override
    public List<MovimientoAux> searchByHecho(Seccione seccion, Date fechaI, Date fechaF) {
        em = getEntityManager();
        Query q;
        if (seccion == null) {
            q = em.createQuery("SELECT d FROM MovimientoAux d WHERE d.fecha>= :fechaI AND d.fecha<=:fechaF AND d.declaracion.tipo <> 'Facturacion' ");

        } else {
            q = em.createQuery("SELECT d FROM MovimientoAux d WHERE d.fecha>= :fechaI AND d.fecha<=:fechaF AND d.declaracion.tipo <> 'Facturacion' AND d.seccion=:seccion");
            q.setParameter("seccion", seccion);
        }

        q.setParameter("fechaI", fechaI);
        q.setParameter("fechaF", fechaF);
        return q.getResultList();
    }

    @Override
    public List<Movimiento> findListFacturasIngreso(Seccione seccion, Date fechaI, Date fechaF) {
        em = getEntityManager();
        Query q = em.createQuery("SELECT m FROM Movimiento m WHERE m.fecha>= :fechaI AND m.fecha<=:fechaF and m.haber IS NOT NULL ");

        q.setParameter("fechaI", fechaI);
        q.setParameter("fechaF", fechaF);
        return (List) q.getResultList();
    }

    @Override
    public Double findSumaFacturasIngreso(Seccione seccion, Date fechaI, Date fechaF) {
         em = getEntityManager();
        Query q = em.createQuery("SELECT SUM(m.total) FROM Movimiento m WHERE m.fecha>= :fechaI AND m.fecha<=:fechaF AND m.haber IS NOT NULL");

        q.setParameter("fechaI", fechaI);
        q.setParameter("fechaF", fechaF);
        return (Double) q.getSingleResult();
    }
    @Override
    public Double findSumaFacturasAdeclarar(Seccione seccion, Date fechaI, Date fechaF) {
         em = getEntityManager();
        Query q = em.createQuery("SELECT SUM(m.total) FROM Movimiento m WHERE m.fecha>= :fechaI AND m.fecha<=:fechaF AND m.haber IS NOT NULL AND m.concepto LIKE '%PRACTIC%'");

        q.setParameter("fechaI", fechaI);
        q.setParameter("fechaF", fechaF);
        return (Double) q.getSingleResult();
    }
}
